package structybxb

import (
	"encoding/json"
	"fmt"
)

type student struct {
	Id   int32  // 主键ID
	Sno  string // 学号
	Name string // 姓名
	// 私有属性不能被json包访问
	age int    // 年龄
	Sex string // 性别
}

// 结构体的序列化:把结构体系列化成JSON类型的字符串
func TestToJson() {
	var s1 = &student{
		Id:   1,
		Sno:  "20230001",
		Name: "张三",
		age:  18,
		Sex:  "男",
	}
	// 打印:类型:*structybxb.student,值是:&{1 20230001 张三 18 男}
	fmt.Printf("序列化前-类型:%T,值是:%v\n", s1, s1)

	// 注意：result是[]byte数组
	result, err := json.Marshal(s1)
	if err != nil {
		fmt.Printf("错误是：%v\n", err)
	} else {
		fmt.Printf("序列化后-类型是:%T, 值是:%v\n", result, string(result))
	}
}

// 结构体的反序列化:把JSON类型的字符串转换成结构体。
func TestToStruct() {
	// var str = "{\"Id\":1,\"Sno\":\"20230001\",\"Name\":\"张三\",\"Sex\":\"男\"}"
	var str = `{"Id":1,"Sno":"20230001","Name":"张三","Sex":"男"}`
	var s2 = &student{}                    // s2是一个结构体类型
	err := json.Unmarshal([]byte(str), s2) // 第二个参数必须是一个指针类型
	if err != nil {
		fmt.Printf("错误是：%v\n", err)
	} else {
		fmt.Println(s2) // 输出结果：&{1 20230001 张三 男}
	}
}
